package com.my.blog.website.utils.backup.db;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;

public class DataTable extends ArrayList<Row> {
    /**
     *
     */
    private static final long serialVersionUID = -3057968190529400383L;

    public static DataTable execute(Connection connection, String query)
            throws SQLException {
        return parse(connection.prepareStatement(query).executeQuery());
    }

    public static DataTable parse(ResultSet resultSet) throws SQLException {
        ResultSetMetaData metaData = resultSet.getMetaData();
        DataTable dataTable = new DataTable();
        dataTable.columns = new ColumnCollection();

        int colCount = metaData.getColumnCount();
        for (int i = 1; i <= colCount; i++) {
            Column column = new Column();
            column.setCatalogName(metaData.getCatalogName(i));
            column.setColumnClassName(metaData.getColumnClassName(i));
            column.setDisplaySize(metaData.getColumnDisplaySize(i));
            column.setLabel(metaData.getColumnLabel(i));
            column.setName(metaData.getColumnName(i));
            column.setPrecision(metaData.getPrecision(i));
            column.setScale(metaData.getScale(i));
            column.setSchemaName(metaData.getSchemaName(i));
            column.setTableName(metaData.getTableName(i));
            column.setType(metaData.getColumnType(i));
            column.setTypeName(metaData.getColumnTypeName(i));
            dataTable.columns.add(column);
        }

        while (resultSet.next()) {
            Object[] data = new Object[colCount];
            for (int i = 1; i <= data.length; i++) {
                data[i - 1] = resultSet.getObject(i);
            }
            dataTable.add(new Row(dataTable, data));
        }
        resultSet.close();
        return dataTable;
    }

    private ColumnCollection columns;

    public ColumnCollection getColumns() {
        return columns;
    }

    @Override
    public String toString() {
        String s = columns.toString() + "\n";
        if (size() == 0) {
            s += "Rows is empty\n";
        } else {
            s += "Rows : {" + String.valueOf(get(0));
            for (int i = 1; i < size(); i++) {
                s += "\n" + String.valueOf(get(i));
            }
            s += "}\n";
        }
        return s;
    }
}
